/*
 * virtual_pwm.h
 *
 *  Created on: 2020年8月12日
 *      Author: Tao
 */

#ifndef _VIRTUAL_PWM_H_
#define _VIRTUAL_PWM_H_

#include "stm32l4xx_hal.h"

/**
 * VirPwm_SetOutput是函数指针类型变量，用来回调端口输出函数
 */
typedef void (*VirPwm_SetOutput)(uint8_t state);

/**
 * 虚拟PWM的结构体类型，通过此变量类型可以完整的定义一个虚拟PWM，以供本库的函数操作
 */
typedef struct{
	uint8_t Status;
	uint8_t Idle;
	uint8_t Precision;				//方波占空比精度（1~3，1位精度为10%，2位精度为1%，3位精度为0.1%）
	uint32_t Frequency;				//为了保证系统运行效率，Frequency x Precision 应当不超过100kHz
	uint32_t DutyCycle;
	TIM_TypeDef *Basetimer;
	VirPwm_SetOutput SetOut;
	uint32_t count_P;				//内部计数使用的变量，与占空比相关
	uint32_t count_N;				//内部计数使用的变量，与占空比相关
} VirPwm;


extern VirPwm *const VirPwmDefArray;

void VirPwm_Init(VirPwm *VirPwmDef,uint16_t freq,uint16_t dutyCycle,uint8_t idle);
void VirPwm_SetStatus(VirPwm *VirPwmDef, uint8_t status);
void VirPwm_SetPrecision(VirPwm *VirPwmDef, uint8_t precision);
void VirPwm_SetFreq(VirPwm *VirPwmDef, uint16_t freq);
void VirPwm_SetDutyCycle(VirPwm *VirPwmDef, uint16_t dutyCycle);
void VirPwm_SetIdle(VirPwm *VirPwmDef, uint8_t idle);
void VirPwm_TimIRQHandler(VirPwm *VirPwmDef);


#endif /* LIBRARIES_SYSEXTEND_INC_VIRTUAL_PWM_H_ */
